# -*- coding: utf-8 -*-

import json
import os
from dotenv import load_dotenv
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
import logging
from flask import Flask, request, jsonify

logger = logging.getLogger(__name__)

class AdjuvantTherapy:
    def __init__(self):
        # 加载环境变量
        load_dotenv()
        api_key = os.getenv("OPENAI_API_KEY")
        base_url = os.getenv("OPENAI_BASE_URL")
        model_name = os.getenv("MODEL_NAME")

        # 初始化 LLM
        self.llm = ChatOpenAI(
            base_url=base_url,
            model=model_name,
            api_key=api_key
        )

        # 创建提示模板
        self.adjuvant_prompt = ChatPromptTemplate.from_template(
            """你是一个博士级别的医生，请对以下病历进行治疗分析和用药分析。
请返回JSON格式的结果：

{{
  "治疗意见": "建议的治疗方式",
  "用药意见": "建议的用药方案"
}}

**要求**：
1. 必须返回有效的 JSON 格式；
2. 不要返回 JSON 外的任何文字；
3. 语言应简洁、医学专业。
病历内容如下：
{case_text}
返回 JSON："""
        )

        self.json_parser = JsonOutputParser()
        self.synthetic_chain = self.adjuvant_prompt | self.llm | self.json_parser

    def analyze_case(self, case_text: str):
        """调用大模型进行病历分析"""
        try:
            result = self.synthetic_chain.invoke({"case_text": case_text})
            return result
        except Exception as e:
            return {"status": "error", "message": str(e)}


def api_adjuvant_therapy_query():
    """
    HTTP API接口 - 自然语言查询
    """
    try:
        # 记录原始请求信息
        logger.info(f"辅助诊疗收到请求 - Content-Type: {request.content_type}, 数据长度: {request.content_length}")

        # 支持三种请求格式：
        # 1. JSON格式: {"query": "..."}
        # 2. Java纯文本: 直接发送查询文本
        # 3. 其他JSON格式

        data = None
        parse_error = None

        # 检查是否是纯文本请求（Java HttpUtils.sendPostText）
        if request.content_type and 'text/plain' in request.content_type:
            # Java纯文本请求，直接读取文本作为query
            raw_data = request.get_data(as_text=True).strip()
            logger.info(f"检测到纯文本请求: {raw_data[:100]}")
            data = {"query": raw_data}
        else:
            # 尝试JSON解析
            try:
                data = request.get_json(force=True)  # force=True 忽略Content-Type
                logger.info(f"成功解析JSON: {data}")
            except Exception as e:
                parse_error = str(e)
                logger.warning(f"JSON解析失败: {e}")

                # 如果JSON解析失败，尝试获取原始文本
                raw_data = request.get_data(as_text=True).strip()
                logger.info(f"原始数据: {raw_data[:200]}")  # 只记录前200字符

                if raw_data:
                    try:
                        data = json.loads(raw_data)
                        logger.info(f"通过原始数据解析成功: {data}")
                    except Exception as e2:
                        logger.warning(f"原始数据JSON解析也失败: {e2}")
                        # 如果是纯文本，当作query参数
                        data = {"query": raw_data}
                        logger.info(f"作为纯文本处理: {data}")

        if not data or 'query' not in data:
            error_msg = f"缺少必需参数: query. 解析错误: {parse_error}, 收到数据: {data}"
            logger.error(error_msg)
            return jsonify({
                "success": False,
                "message": "缺少必需参数: query",
                "error": "参数错误",
                "debug_info": error_msg if parse_error else None
            }), 400

        user_query = data.get('query', '').strip()

        if not user_query:
            return jsonify({
                "success": False,
                "message": "查询内容不能为空",
                "error": "参数错误"
            }), 400

        adjuvant_therapy= AdjuvantTherapy()
        # 获取报表实例
        result = adjuvant_therapy.analyze_case(raw_data)


        return jsonify(result), 200

    except Exception as e:
        logger.error(f"HTTP查询发生错误: {str(e)}")
        return jsonify({
            "success": False,
            "message": "查询执行失败",
            "error": str(e)
        }), 500

def register_therapy_routes(flask_app):
    """注册路由到Flask应用"""
    global app
    app = flask_app

    # 手动注册路由（不使用装饰器）
    app.add_url_rule('/api/therapy_query', 'api_adjuvant_therapy_query', api_adjuvant_therapy_query, methods=['POST'])

    print("【辅助治疗】路由已注册到 Flask 应用")
if __name__ == "__main__":
    AdjuvantTherapy().main()
